feat(scratch-gui): 甲子園 Ruby v2 対応(when_connect_game イベント hat + リスト引数 $配列構文)#744
feat(scratch-gui): 甲子園 Ruby v2 対応(when_connect_game イベント hat + リスト引数 $配列構文)#744takaokouji wants to merge 5 commits into
Conversation
甲子園拡張機能の calc_route / calc_goal_route / locate_objects は、リスト引数を
バージョン非依存で list("$名前") とハードコードしており、Ruby v2 では
「list() syntax is only available in Ruby version 1」エラーになっていた。
v2 ではリストはグローバル配列変数 $名前 で表現するため:
- generator: version === '2' のとき list("$名前") ではなく $名前 を出力
- converter: v2 では引数の配列変数 ($名前 = data_variable) を convertToListBlock で
リスト化して受理 (v1 の list() ブロックと同じリスト名に解決)
v1 の挙動は不変 (既存 roundtrip テスト緑)。v2 roundtrip テストを追加。
Refs #743
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
🚀 Preview deployed: https://smalruby.jp/smalruby3-editor/feature/issue-743-koshien-ruby-v2/ |
✅ ブラウザ DoD 確認(プレビューで実機検証, ruby_version=2)プレビュー v2 の甲子園プログラム(リストは配列変数 class Sprite1 < Smalruby3::Sprite
when_flag_clicked do
koshien.connect_game(name: "player1")
koshien.calc_route(result: $最短経路)
koshien.locate_objects(result: $地形, sq_size: 3, cent: "1:2", objects: "ABCD")
koshien.move_to($最短経路[1])
koshien.turn_over
end
end
→ 「v2 でエラーなくブロック化され、Ruby に戻すと |
v2 では甲子園プログラムをクラス表現 (class < Smalruby3::Sprite) の中に置くため、
ゲーム接続をフラットな文ではなく「ブロックを取るイベント hat」で表現する。
- generator: koshien_connectGame は v2 で
`koshien.when_connect_game(name:) do ... end` を生成し、AI 本体を do...end の
サブスタックに包む (block.isStatement=true → scrub_ が next 連鎖を字下げ + end)。
v1 は従来どおりフラット `koshien.connect_game(name:)`。
- converter:
- `koshien.when_connect_game(name:) do ... end` (v2) を hat + サブスタックとして解析。
- フラット `koshien.connect_game(name:)` は v1 で statement、v2 ではエラー
(when_connect_game を使うよう促す)。
- v2 roundtrip テスト (when_connect_game + リスト$配列) / v2 フラットエラー /
v1 フラット維持 を追加。
ブロック opcode/構造は不変のため、既存 sb3 プロジェクトはそのまま読み込める。
Refs #743
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
追加コミット: ゲーム接続をイベント hat 化(
|
✅ ブラウザ DoD 確認: when_connect_game イベント hat(CI 全 green 後・更新プレビュー)
① v2:
|
…on loaded 甲子園拡張機能を v2 対応にしたため、「koshien 有効時は Ruby バージョンを変更できない」 という guard / アラートは不要になった。settings-menu と mobile-drawer の両方から削除し、 未使用になったメッセージ koshienCannotChangeRubyVersion とロケール(ja/ja-Hira/en)も除去。 v1↔v2 切替時の「v2機能(class/module)使用中は v1 に戻せない」guard は維持。 Refs #743 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Selecting the Koshien extension while in Ruby v2 popped an alert
("only available for Ruby v1") and refused to load it. Now that koshien
supports v2 (class representation + when_connect_game), this guard is
obsolete. Removed the rubyVersion check, its message, the unused
rubyVersion prop/mapStateToProps, and the locale strings.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Switching to Ruby v2 with the koshien extension loaded is now allowed (koshien supports v2), so the stale "shows alert / blocks the change" test is replaced with one asserting the change goes through without an alert. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Summary
スモウルビー甲子園拡張機能を Ruby v2 でも使えるようにする一歩目。リスト引数を取る 3 ブロック(
calc_route/calc_goal_route/locate_objects)が v2 でエラーになる問題を修正します。Epic #738 / #743 Phase 2(editor)。問題
generator がリスト引数をバージョン非依存で
list("$名前")とハードコードしていたため、v2 では「list() syntax is only available in Ruby version 1」エラーで変換に失敗していました(他の甲子園ブロックは v2 で動作することは確認済み)。v2 ではリストはグローバル配列変数$名前($名前.push()/$名前[0])で表現します。Changes Made
ruby-generator/koshien.js):koshienListArgヘルパーを追加し、version === '2'のときはlist("$名前")ではなく$名前を出力(calc_routeの result/except_cells、calc_goal_routeの result、locate_objectsの result)。ruby-to-blocks-converter/koshien.js):resolveListArgを追加。v2 では引数の配列変数($名前=data_variable)をconvertToListBlockでリスト化して受理する。解決されるリスト名は v1 のlist("$名前")と同一なので、フィールド値の互換性が保たれる。Test Coverage
test/unit/lib/ruby-roundtrip/extension_koshien_v2.test.js: v2 でcalc_route/calc_goal_route/locate_objectsが$名前構文で round-trip することを検証。extension_koshien.test.js) + converter ユニット (koshien.test.js) が引き続き緑(回帰なし)。関連: クラス表現(class < Smalruby3::Sprite/Stage)について
v2 の本質は class 表現で、そのランタイム対応はクライアントライブラリ側(
tmp/smalruby-koshien/src/lib)の対応が主です。これは別途パッチ + 開発者向け改善依頼として #743 にまとめています(検証済み)。本 PR はそのうち editor が出力する v2 コードの構文(リスト引数) を正す範囲です。Definition of Done
?ruby_version=2): 甲子園 v2 プログラムがエラーなくブロック化され、Ruby に戻すと$名前構文で出力されるRelated Issues
Refs #743 / Epic #738
🤖 Generated with Claude Code